 La version numrique du sujet fournie en fichier texte (format *.txt) doit tre ouverte en tant que braille informatique. Elle sera affiche en braille 6 points. Lapplication  bloc-notes  des ordinateurs courants, ou des logiciels spcialiss peuvent tre utiliss.  dfaut, reportez-vous  la version en papier. 
Le candidat doit rdiger ses rponses sur un second fichier, et peut demander  un assistant ou  un secrtaire de recopier sa production de faon manuscrite sur une copie.
Un fichier en format *.pdf est galement fourni.
La page du document originale est indique par  PO 1  pour  page originale n1 . Les rfrences aux pages braille (sommaire, rfrences en cours de sujet) font rfrence au sujet braille emboss. 

po `1
`24-nsij`2me1
braille intgral
baccalaurat gnral
preuve d'enseignement de spcialit
session `2024
numrique et sciences informatiques
preuve du jeudi `20 juin `2024
dure de l'preuve: `3 heures `30
l'usage de la calculatrice n'est pas autoris.
ds que ce sujet vous est remis, assurez-vous qu'il est complet.
ce sujet comporte `15 pages numrotes de `1  `15 dans la version originale. dans la version en braille intgral, le sujet comporte `48 pages numrotes de `1  `48 `! `2 planches tactiles en fin de volume. l'ensemble des planches tactiles est propos sur papier thermogonfl.
conformment au code braille, les espaces  remplir prsents dans l'original sont symboliss par les signes `-'.
le sujet est compos de trois exercices indpendants.
le candidat traite les trois exercices.
sommaire
exercice `1 `4
partie a: bases de donnes `4
partie b: scurisation `11
exercice `2 `13
partie a: quelques outils `16
partie b: premire approche de rangement `18
partie c: rangement optimis par rcursivit `24
exercice `3 `28
partie a: analyse des classes piste et domaine `29
partie b: recherche par force brute `36
annexe `45
po `2
exercice `1 (`6 points)
cet exercice porte sur la notion de bases de donnes relationnelles, le langage sql et les protocoles de scurisation.
partie a: bases de donnes
l'nonc de cette partie utilise les mots du langage sql suivants: :select, from, where, join, update, set, delete. l'attribut auto-increment permet d'incrmenter automatiquement un entier dans une table  l'insertion d'un nouvel lment.
bob, qui dispose d'une trs grande collection de cd-s rangs sur plusieurs tagres numrotes, a mis en place une base de donnes. voici la description des trois relations de cette base dont les cls primaires ont t soulignes et les cls trangres indiques par un 0:
`;voir planche tactile no`1' `1. indiquer, avec justification, s'il aurait t possible de choisir l'attribut nom-artiste comme cl primaire dans la relation cd.
dans la suite, on considre les cls trangres suivantes:
-- cd.nom-artiste qui rfrence l'attribut artiste.nom-artiste;
-- rangement.id-album qui rfrence l'attribut cd.-id-album.
voici un extrait des enregistrements des relations cd, artiste et rangement dfinies plus haut:
po `3
table cd:
`;tableau linaris'
id-album; titre-album; nom-artiste; anne
`1; 'master of puppets'; 'metallica'; `1986
`2; 'the marshall mathers lp'; 'eminem'; `2000
`3; 'wasting light'; 'foo fighters'; `2011
`4; 'wishmaster'; 'nightwish'; `2001
`5; 'dead letters'; 'the rasmus'; `2003
`6; 'somewhere in time'; 'iron maiden'; `1986 table artiste:
`;tableau linaris'
nom-artiste; pays; style
'nightwish'; 'finlande'; 'metal'
'foo fighters'; 'etats-unis'; 'rock'
'metallica'; 'etats-unis'; 'metal'
'iron maiden'; 'royaume-uni'; 'metal'
'eminem'; 'etats-unis'; 'rap'
'the rasmus'; 'finlande'; 'rock'
table rangement:
`;tableau trait en colonne'
id-album numero-etagere
`1  `2
`2  `1
`3  `1
`4  `3
`5  `3
`6  `2
po `4
`2. crire ce que renvoie la requ2te suivante lorsqu'on l'applique aux extraits ci-dessus.
select nom-artiste
from artiste
where pays
`" "finlande";
`3. crire  prsent ce que renvoie la requ2te suivante.
select cd.annee
from cd
join artiste
on cd.nom-artiste
`" artiste.nom-artiste
where artiste.style
`" "metal"; bob se rend compte que l'album wishmaster est en ralit sorti en `2000.
`4. donner la requ2te qu'il doit crire pour mettre  jour sa base de donnes.
`5. donner la requ2te qu'il doit crire pour afficher les titres de tous les albums de "metal" rangs sur l'tagre dont le numro est `1.
bob a vendu l'album dead letters du groupe the rasmus. puisqu'il s'agissait du seul album de ce groupe qu'il possdait, il veut supprimer tous les enregistrements qui sont  prsent inutiles dans les trois relations.
`6. donner l'ordre dans lequel il doit les supprimer en expliquant pourquoi, puis crire la requ2te correspondant  la suppression de l'album dans la relation cd.
partie b: scurisation
la base de donnes de bob est hberge sur un serveur auquel il accde depuis un client sur son ordinateur personnel. pour scuriser la connexion, un algorithme de chiffrement symtrique est utilis.
`7. expliquer brivement ce qu'est un algorithme de chiffrement symtrique.
la cl de chiffrement, note c dans la suite, est choisie alatoirement par le serveur  chaque connexion depuis un client. afin que le chiffrement et le dchiffrement puisse se faire sans problme, le serveur doit envoyer au client la cl c de faon scurise.
`8. rappeler brivement ce qu'est un algorithme de chiffrement asymtrique.
on suppose  prsent que bob possde une cl publique et une cl prive. la cl publique de bob est suppose connue par le serveur.
`9. proposer alors une solution pour que le serveur puisse envoyer la cl c  l'ordinateur de bob de faon scurise, c'est--dire pour que seul bob puisse dchiffrer la cl envoye.
po `5
exercice `2 (`6 points)
cet exercice porte sur la programmation oriente objets, les tris, les algorithmes gloutons, la rcursivit et les assertions.
cet exercice est compos de trois parties dont les deux dernires sont indpendantes entre elles.
dans cet exercice, l'ent2te des fonctions est dcrit avec le type des objets en paramtre et le type de l'objet renvoy. ainsi la fonction puissance qui prend un paramtre flottant ?x* et un entier ?n* puis qui renvoie le flottant ?x**n*, a pour ent2te ?puissance(x: float,  n: int) --@ float*
une entreprise transporte des marchandises. elle souhaite maximiser son profit en optimisant le remplissage de ses moyens de transport. on considre qu'un moyen de transport est limit par son volume (exprim en litres). chaque marchandise est caractrise par son prix (en euros) et son volume indivisible (en litres).
supposons qu'on ait trois marchandises caractrises par les couples (prix, volume) suivants:
-- `m?1"(100,10),
-- `m?2"(100,10) et
-- `m?3"(250,20).
si le moyen de transport peut encore charger `25 litres, il vaut mieux charger la marchandise numro `3 qui rapporte `250 e  l'entreprise plut4t que charger les marchandises numros `2 et `3 qui rapportent `200 e au total pour le m2me espace utilis.
partie a: quelques outils
nous souhaitons dfinir une classe ?marchandise* dont chaque instance dfinit une marchandise possdant deux attributs entiers ?prix* et ?volume*.
`1. complter le constructeur qui renvoie un objet ?marchandise*. utiliser le mot-cl ?assert* afin qu'une exception soit leve si le paramtre ?v* n'est pas strictement positif.
on rappelle que si ?condition* est une expression python boolenne
s'valuant  ?true* ou ?false*, l'instruction
?assert condition* dclenche une exception quand la condition s'value  ?false*.
class marchandise:
def --init--(self,
p: int, v: int) --@ 'marchandise':
`-'
`2. donner une instruction qui permet de crer une variable ?m`1* reprsentant une marchandise d'un volume de `7 litres co5tant `20 e.
`3. proposer une mthode
?ratio(self) --@ float* qui renvoie le ratio prix/volume d'une marchandise.
`4. proposer une fonction ?prixliste(tab: list)  --@ int* qui renvoie le prix cumul de l'ensemble des marchandises formant le tableau ?tab*.
po `6
partie b: premire approche de rangement
le transporteur souhaite maximiser son profit. on considre que nous avons les quatre marchandises dfinies par les couples (prix, volume) suivants:
`m?1"(40,20),
`m?2"(210,70),
`m?3"(160,40) et
`m?4"(50,50).
`5. prciser toutes les combinaisons de marchandises possibles si on ne dpasse pas un volume de `100 litres et le prix associ. en dduire la combinaison de marchandises qui maximise le prix.
une premire mthode appele ?chargementglouton* consiste  trier les marchandises dans l'ordre dcroissant de leur prix volumique (ratio prix/volume), puis transporter en priorit les marchandises avec le plus grand prix volumique. si une marchandise est trop volumineuse pour 2tre transporte, on essaie avec la marchandise ayant le prix volumique juste infrieur, ce jusqu' ce qu'aucune marchandise ne puisse rentrer. ainsi, en notant ?v-restant* le volume disponible et ?m-i* la `(i!1)^e marchandise une fois les marchandises tries, l'algorithme peut s'crire:
?chargementglouton
n `" nombre de marchandises
pour i allant de `0  `n-1 faire
 si volume de m-i
`2" v-restant alors
 charger m-i
 v-restant
`" v-restant
`- volume de m-i
transporter le chargement prvu*
le tri dans l'ordre dcroissant des prix volumiques donne `m?1, `m?2, `m?1, `m?4. si le moyen de transport accepte `100 litres de chargement, l'algorithme charge `m?3 et `m?1 pour un prix de `200 e ( comparer avec la combinaison trouve prcdemment pour maximiser le prix).
par la suite, on rappelle que dans l'implmentation python, les marchandises sont dfinies par des instances de la classe ?marchandise*.
on donne quelques qualificatifs: dichotomique, glouton, graphique, insertion, maximum, rcursif, tri.
`6. indiquer, sans justification, le qualificatif qui s'applique le mieux  l'algorithme prcdent.
po `7
`7. recopier et complter la fonction ?tri(tab: list) --@ none* ci-dessous afin qu'elle trie en place un tableau contenant des objets de type ?marchandise* selon l'ordre dcroissant des ratios. ainsi, ?tab(`0)b* doit contenir la marchandise avec le plus haut ratio prix/volume aprs l'appel ?tri(tab)*.
def tri(tab: list) --@ none:
n `" len(tab)
for i in range(`1, n):
marchandise `" tab(i)b
j `" `i-1
while `-' and `-' @ `-':
tab(j`!1)b `" `-'
j `" `-'
tab(j`!1)b `"
marchandise
`8. sans justifier, prciser le nom de ce tri, ainsi que son co5t temporel dans le pire des cas (constant, logarithmique, linaire, quasi-linaire `(n log?2 n), quadratique, cubique ou exponentiel).
`9. recopier et complter la fonction ?charge* suivante qui applique l'algorithme ?chargementglouton* dcrit plus haut.
def charge(tab: list, volume: int) --@ list:
tri(tab)
chargement `" ()b
n `" len(tab)
for `-'
if `-'
`-'
`-'
return `-'
partie c: rangement optimis par rcursivit
l'algorithme prcdent ne renvoie pas toujours une solution optimale. on peut donc suivre un algorithme rcursif. on note `n le nombre de marchandises et on souhaite implmenter la fonction rcursive ?chargeoptimale* d'ent2te:
?chargeoptimale(tab: list,  v-restant: int, i: int)  --@ list*
un appel  cette fonction doit permettre de calculer la charge optimale pour un transport de volume
?v-restant* utilisant les marchandises  partir de l'indice ?i*:
-- si ?i @`" n*, toutes les marchandises ont t essayes et il n'en reste plus d'autres disponibles. l'appel rcursif renvoie la liste vide;
-- si ?i 2 n* et la marchandise d'indice ?i* est de volume strictement suprieur au volume restant, l'appel rcursif renvoie le rsultat de l'appel effectu avec le m2me volume restant mais avec la marchandise suivante, c'est--dire ?chargeoptimale(tab, v-restant, i`!1)*;
po `8
-- si ?i 2 n* et la marchandise d'indice ?i* est de volume infrieur ou gal au volume restant, il existe deux options possibles:
-- option `1:
soit on utilise la marchandise ?i*, auquel cas le chargement contiendra cette marchandise et celles du rsultat de l'appel rcursif  partir de la prochaine marchandise et d'un volume restant strictement infrieur,
-- option `2:
soit on n'utilise pas la marchandise ?i*, auquel cas le chargement sera le rsultat de l'appel rcursif avec le m2me volume restant mais  partir de la marchandise suivante.
on garde l'option de chargement qui maximise le prix transport.
`10. complter le code de la fonction ?chargeoptimale* dont le principe a t dcrit ci-avant.
def chargeoptimale(tab: list, v-restant: int, i: int) if i @`" `-':
return `-'
else:
if tab(i)b.volume 
@ v-restant:
return
chargeoptimale(tab, v-restant, i`!1)
else:
option`1 `" chargeopti
male(tab, `-', `-')
option`2 `" (tab(i)b)b `! chargeoptimale(
tab, `-', `-')
if prixliste(option`1)
@ prixliste
(option`2):
return `-'
else:
return `-'
po `9
exercice `3 (`8 points)
cet exercice porte sur la programmation oriente objet, les graphes et utilise la structure de donnes dictionnaire.
la direction de la station de ski le livre blanc, spcialise dans la pratique du ski de fond, souhaite disposer d'un logiciel lui permettant de grer au mieux son domaine skiable. elle confie  un dveloppeur informatique la mission de concevoir ce logiciel. celui-ci dcide de caractriser les pistes de ski  l'aide d'une classe ?piste* et le domaine de ski par une classe ?domaine*.
le code python de ces deux classes est donn en annexe.
partie a: analyse des classes ?piste*
et ?domaine* `1. lister les attributs de la classe ?piste* en prcisant leur type. la difficult des pistes de ski de fond est reprsente par `4 couleurs: verte, bleue, rouge et noire. la piste verte est considre comme trs facile, la piste bleue comme facile, la piste rouge de difficult moyenne et la piste noire difficile.
dans la station de ski le livre blanc, l'quipe de direction dcide de s'appuyer uniquement sur le dnivel pour attribuer la couleur d'une piste de ski.
ainsi, une piste de ski sera de couleur:
-- '?noire*' si son dnivel est suprieur ou gal  `100 mtres;
-- '?rouge*' si son dnivel est strictement infrieur  `100 mtres, mais suprieur ou gal  `70 mtres;
-- '?bleue*' si son dnivel est strictement infrieur  `70 mtres, mais suprieur ou gal  `40 mtres;
-- '?verte*' si son dnivel est strictement infrieur  `40 mtres.
`2. crire la mthode ?set-couleur* de la classe ?piste* qui permet d'affecter  l'attribut ?couleur* la cha3ne de caractres correspondant  la couleur de la piste. on excute  prsent le programme suivant afin d'attribuer la couleur adquate  chacune des pistes du domaine skiable le livre blanc.
`1 for piste in lievre-
blanc.get-pistes():
`2 piste.set-couleur()
po `10
`3. indiquer, parmi les `4 propositions ci-dessous, le type de l'lment renvoy par l'instruction python ?lievre-blanc.get- pistes()*.
-- proposition a: une cha3ne de caractres;
-- proposition b: un objet de type ?piste*;
-- proposition c: une liste de cha3nes de caractres;
-- proposition d: une liste d'objets de type ?piste*.
en raison d'un manque d'enneigement, la direction de la station est souvent contrainte de fermer toutes les pistes vertes car elles sont situes gnralement en bas du domaine.
`4. crire un programme python dont l'excution permet de procder  la fermeture de toutes les pistes vertes en affectant la valeur ?false*  l'attribut ?ouverte* des pistes concernes.
`5. crire une fonction ?pistes-de-couleur* prenant pour paramtres une cha3ne de caractres ?couleur* reprsentant la difficult d'une piste et une liste ?lst* de pistes de ski de fond. cette fonction renvoie la liste des noms des pistes dont ?couleur* est le niveau de difficult.
exemple: l'instruction ?pistes-de-couleur(lievre- blanc.get-pistes(), 'noire')* renvoie la liste ?('petit bonheur', 'for2t', 'duvallon')b*.
un skieur de bon niveau se prpare assid5ment pour le prochain semi-marathon, d'une distance de `21,1 kilomtres.  chaque entra3nement, il note la liste des noms des pistes qu'il a parcourues et il souhaite disposer d'un outil lui indiquant si la distance totale parcourue est au moins gale  la distance qu'il devra parcourir le jour du semi-marathon.
la fonction
?semi-marathon* donne
ci-dessous rpond aux attentes du skieur: cette fonction prend en paramtre une liste ?l* de noms de pistes et renvoie un boolen gal  ?true* si la distance totale parcourue est strictement suprieure  `21,1 kilomtres, ?false* sinon.
`1 def semi-marathon(l):
`2 distance `" `-'
`3 liste-pistes `"
lievre-blanc.
get-pistes()
`4 for nom in l:
`5 for piste in
liste-pistes:
`6 if piste.get-nom()
`"" `-':
`7 distance `"
distance `! `-'
`8 return `-'
po `11
on donne ci-dessous deux exemples d'appels  cette fonction:
?@@@ entrainement`1 `"  ('verneys', 'chateau  enneig', 'rois mages',  'diablotin')b
@@@ semi-marathon(entrainement`1)
true
@@@ entrainement`2 `"  ('esseillon', 'aigle  royal', 'duvallon')b
@@@ semi-marathon(entrainement`2)
false* `6. recopier et complter la fonction semi-marathon.
partie b: recherche par force brute le plan des pistes du domaine le livre blanc peut 2tre reprsent par le graphe suivant:
figure `1: graphe du domaine le livre blanc
`;voir la planche tactile no`2' sur chaque ar2te, on a indiqu le nom de la piste et sa longueur en kilomtres.
les sommets correspondent  des postes de secours.
un pisteur-secouriste de permanence au point de secours d est appel pour une intervention en urgence au point de secours a. la motoneige de la station tant en panne, il ne peut s'y rendre qu'en skis de fond. il dcide de minimiser la distance parcourue et cherche  savoir quel est le meilleur parcours possible. pour l'aider  rpondre  ce problme, on dcide d'implmenter le graphe ci-dessus gr1ce au dictionnaire de dictionnaires suivant:
domaine `" ``(
'a': ``('g': `7.5,
'h': `6.8)'',
'b': ``('c': `3.0,
'd': `9.2, 'e': `1.8, 'f': `4.6)'',
'c': ``('b': `3.0,
'd': `2.5, 'e': `6.1, 'g': `10.7)'',
'd': ``('b': `9.2,
'c': `2.5)'',
'e': ``('b': `1.8,
'c': `6.1, 'f': `10.1, 'g': `12.7)'',
'f': ``('b': `4.6,
'e': `10.1, 'g': `2.6, 'h': `3.4)'',
'g': ``('a': `7.5,
'c': `10.7, 'e': `12.7, 'f': `2.6, 'h': `5.5)'',
'h': ``('a': `6.8,
'f': `3.4, 'g': `5.5)''
)''
po `12
`7. crire une instruction python permettant d'afficher la longueur de la piste allant du sommet '?e*' au sommet '?f*'.
`8. crire une fonction ?voisins* qui prend en paramtres un graphe ?g* et un sommet ?s* du graphe ?g* et qui renvoie la liste des voisins du sommet ?s*.
exemple: l'instruction ?voisins(domaine, 'b')* renvoie la liste ?('c', 'd', 'e', 'f')b*.
`9. recopier et complter la fonction ?longueur-chemin* donne ci-dessous: cette fonction prend en paramtres un graphe ?g* et un chemin du graphe ?g* sous la forme d'une liste de sommets et renvoie sa longueur en kilomtres.
exemple: l'instruction l?ongueur-chemin(domaine, ('b', 'e', 'f', 'h')b)* renvoie le nombre flottant ?`15.3*.
`1 def longueur-chemin(g,
chemin):
`2 precedent `" `-'
`3 longueur `" `0
`4 for i in range
(`1, len(chemin)):
`5 longueur
`" longueur `! `-'
`6 precedent `" `-'
`7 return `-'
on donne ci-dessous une fonction ?parcours* qui renvoie la liste de tous les chemins du graphe ?g* partant du sommet ?depart* et parcourant les sommets de faon unique, c'est--dire qu'un sommet est atteint au plus une fois dans un chemin.
par exemple, l'appel ?parcours(domaine, 'a')* renvoie la liste de tous les chemins partant du sommet a dans le graphe ?domaine* sans se soucier ni de la longueur du chemin, ni du sommet d'arrive. ainsi, ?('a', 'g', 'c')b* est un chemin possible, tout comme ?('a', 'g', 'c', 'b', 'e', 'f', 'h')b*.
`1 def parcours(g, depart,
chemin `" ()b, lst-
chemins `" ()b):
`2 if chemin `"" ()b:
`3 chemin `" (depart)b
`4 for sommet in voi
sins(g, depart):
`5 if sommet not in
chemin:
`6 lst-chemins 
.append(chemin
`! (sommet)b)
`7 parcours(g, sommet,
chemin `!
(sommet)b)
`8 return lst-chemins
`10. expliquer en quoi la fonction ?parcours* est une fonction rcursive.
un appel  la fonction ?parcours* prcdente renvoie une liste de chemins dans laquelle figurent des doublons.
`11. recopier et complter la fonction ?parcours-dep -arr* ci-aprs qui renvoie la liste des chemins partant du sommet ?depart* et se terminant par le sommet ?arrivee* dans le graphe ?g* entrs en paramtres. la liste renvoye ne doit pas comporter de doublons. attention, plusieurs lignes de code sont ncessaires.
po `13
`1 def parcours-dep-arr(g, depart, arrivee):
`2 liste `" parcours(g,
depart)
`3 `-'
`12. recopier et complter la fonction ?plus-court* donne ci-dessous. la fonction ?plus-court* prend pour paramtres un graphe ?g*, un sommet de dpart ?depart* et un sommet d'arrive
?arrivee*; elle renvoie un des chemins les plus courts sous la forme d'une liste de sommets. `1 def plus-court(g,
depart, arrivee):
`2 liste-chemins `" 
parcours-dep-arr( 
g, depart, arrivee)
`3 chemin-plus-court 
`" `-'
`4 minimum `"
longueur-chemin(g,
chemin-plus-court)
`5 for chemin in
liste-chemins:
`6 longueur `"
longueur-chemin(g,
chemin)
`7 if `-':
`8 minimum `" `-'
`9 chemin-plus-court
`" `-'
`10 return chemin-plus-
court
`13. expliquer en quoi le choix fait par le pisteur-secouriste de choisir la distance minimale pour arriver le plus rapidement possible sur le lieu de l'incident est discutable. proposer un meilleur critre de choix.
po `14
annexe
`1 0 pistes
`2 class piste:
`3 def --init--(self,
nom, denivele,
longueur):
`4 self.nom `" nom
`5 self.denivele
`" denivele 0 en
mtres
`6 self.longueur `"
longueur
0 en kilomtres
`7 self.couleur `" ''
`8 self.ouverte `" true
`9 def get-nom(self):
`10 return self.nom
`11 def get-longueur(self):
`12 return self.longueur
`13 def set-couleur(self):
`14 0  complter
`15 def get-couleur(self):
`16 return self.couleur
`17 0 domaine skiable
`18 class domaine:
`19 def --init--
(self, a):
`20 self.nom `" a
`21 self.pistes `" ()b
`22 def ajouter-piste(self,
nom-piste, denivele,
longueur):
`23 self.pistes.append( 
piste(nom-piste,
denivele, longueur))
`24 def get-pistes(self):
`25 return self.pistes
`26 0 programme principal
`27 lievre-blanc `"
domaine("le livre
blanc")
`28 lievre-blanc 
.ajouter-piste(
'aveyrole', `62, `9.2)
`29 lievre-blanc 
.ajouter-piste(
'verneys', `10, `2.5)
`30 lievre-blanc 
.ajouter-piste(
'vincendires', `45, `3)
`31 lievre-blanc 
.ajouter-piste(
'ribon', `70, `6.1)
`32 lievre-blanc 
.ajouter-piste(
'esseillon', `8, `1.8)
`33 lievre-blanc 
.ajouter-piste(
'petit bonheur', `310,
`4.6)
`34 lievre-blanc 
.ajouter-piste(
'aigle royal', `85, `10.1)
`35 lievre-blanc 
.ajouter-piste(
'ch1teau enneig', `54,
`10.7)
`36 lievre-blanc 
.ajouter-piste(
'sallanches', `78, `12.7)
`37 lievre-blanc 
.ajouter-piste(
'for2t', `145, `2.6)
po `15
`38 lievre-blanc 
.ajouter-piste(
'hermine', `27, `7.5)
`39 lievre-blanc 
.ajouter-piste(
'rois mages', `42, `5.5)
`40 lievre-blanc 
.ajouter-piste(
'diablotin', `76, `6.8)
`41 lievre-blanc 
.ajouter-piste(
'duvallon', `200, `3.4)

